本篇是故事五的「內化」篇。
本篇要回答:把「拒絕用一個 bool 說謊」落成一份可實作的非同步命令契約,長什麼樣子?
拒絕一個需求的正確姿勢,不是只說「做不到」,而是給出「做得到的版本」。Day 24 證明了布林介面必然說謊;這一篇交出替代品——非同步命令契約:
呼叫端的使用方式隨之改變:從「呼叫→拿到成敗」變成「呼叫→拿到 command_id→訂閱或輪詢結果」。同步的錯覺消失了,換來的是每個狀態都有證據背書。
我曾擔心這套契約「把簡單的事搞複雜」。後來想通:複雜度從來沒有增加,它本來就在那裡——八層旅程、逾時、重試、未知狀態,一個都不會因為介面假裝簡單而消失。布林介面只是把複雜度掃進事故日的地毯下面;契約只是把它攤回桌面,逐項標價。
契約的驗收方式(對照 Day 30 的改善措施標準):正常路徑——命令走完全程,狀態依序推進且全程可用 command_id 對帳;失敗路徑——設備明確拒絕,狀態停在 failed 且附設備回應;逾時路徑——結果回路中斷時,狀態在期限後轉為 timed_out 而非 false;重複路徑——同一冪等鍵重送,設備端動作不重複執行。四條路徑都能在測試環境演練,這份契約才算存在。
區分證據等級。已確認事實:契約各條款皆為可實作、可測試的機制。合理推論:導入後事故調查時間顯著縮短——因為 Day 22 那張表的每一格都有了固定住址。執行假設:需求方接受「受理≠完成」的介面語意——這需要 Day 21 到 24 的論證當溝通材料,這個系列某種程度上就是為了那場溝通而寫的。
系統要求最前面那一層,替後面所有尚未發生的事情保證成功。
我不是不願意回答指令成功與否;我只是拒絕在指令還走在路上時,替遠端設備簽下完工證明。
五個故事到此全部收束。最後五天(Day 26 起),把五次踩雷疊在一起看——它們其實是同一種事故的五種變形。